package cn.gjxblog.scheduling.jdk.timer;

import cn.gjxblog.base.LogUtils;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import java.util.*;

/**
 * Timer 调度器
 * TimerTask 作业
 *
 * Timer 是JDK1.3推出的定时任务解决方案
 *
 * 缺点：
 *  1） 单线程调度，某个任务耗时，会影响到其他任务
 *  2） Timer线程不会捕获异常，如果某个TimerTask抛出未检查异常，会引起整个Timer线程中止，进而影响其他TimerTask执行。
 */
@RunWith(JUnit4.class)
public class TestTimer {
    Timer timer;
    List<TimerTask> taskList = new ArrayList<>();

    @Before
    public void before(){
        timer = new Timer();
        for (int i = 1; i < 3; i++) {
            taskList.add(new MyTimerTask(i+""));
        }
    }


    @Test
    public void test1() throws InterruptedException {
        LogUtils.printThreadInfo();
        for (TimerTask timerTask : taskList) {
            timer.schedule(timerTask,1000);
        }
        Thread.sleep(1000*30);
    }

    /**
     * 1） 一个Timer中的任务都是顺序执行，如果需要并发执行需要多个Timer
     * 2)  如果到了task任务的执行时间没有被调度，等下次任务被调度的时候会立刻执行
     */
    @Test
    public void test2() throws InterruptedException {
        LogUtils.printThreadInfo();

        timer.schedule(taskList.get(0),1000,1000);
        timer.schedule(taskList.get(1),0,2000);

        Thread.sleep(1000*30);
    }

    @Test
    public void test3() throws InterruptedException {
        LogUtils.printThreadInfo();

        timer.scheduleAtFixedRate(taskList.get(0),1000,1000);
        timer.scheduleAtFixedRate(taskList.get(1),0,2000);

        Thread.sleep(1000*30);
    }



}
